package gxm

import (
	"fmt"
	"github.com/xuri/excelize/v2"
)

// Write 向指定列写入数据
// 参数：
//   col - 列号，从0开始（0表示第A列）
//   data - 要写入的数据切片，按行顺序写入指定列
// 返回值：
//   *ApiWrite - 支持链式调用的ApiWrite指针
// 说明：
//   - 如果col为负数，会设置api.Err错误并返回
//   - 创建新文件或在现有文件中写入列数据
//   - 数据按行顺序写入，data[0]写入第1行，data[1]写入第2行，以此类推
//   - 支持链式操作，可以连续调用多个方法
// 示例：
//   api.Write(0, []interface{}{"姓名", "张三", "李四"})  // 写入A列
//   api.Write(1, []interface{}{"年龄", 25, 30})        // 写入B列
func (api *ApiWrite) Write(col int, data []interface{}) *ApiWrite {
	// 参数验证：检查列号是否为负数
	if col < 0 {
		api.Err = fmt.Errorf("列号不能为负数")
		return api
	}
	
	// 创建新的Excel工作簿或打开现有文件
	f, err := excelize.OpenFile(api.FileName)
	if err != nil {
		// 如果文件不存在，创建新文件
		f = excelize.NewFile()
	}
	
	defer func() {
		// 确保工作簿正确关闭，释放资源
		if err = f.Close(); err != nil {
			fmt.Printf("关闭文件失败: %v\n", err)
		}
	}()
	
	// 验证列号有效性
	_, err = excelize.ColumnNumberToName(col + 1) // Excel列号从1开始
	if err != nil {
		api.Err = fmt.Errorf("列号转换失败: %v", err)
		return api
	}
	
	// 按行顺序写入数据到指定列
	for rowIdx, value := range data {
		// 构建单元格坐标（如A1, A2, A3...）
		cell, err := excelize.CoordinatesToCellName(col+1, rowIdx+1)
		if err != nil {
			api.Err = fmt.Errorf("坐标转换失败: %v", err)
			return api
		}
		
		// 设置单个单元格的值
		err = f.SetCellValue(api.SheetName, cell, value)
		if err != nil {
			api.Err = fmt.Errorf("写入单元格失败: %v", err)
			return api
		}
	}
	
	// 保存工作簿到指定文件路径
	if err := f.SaveAs(api.FileName); err != nil {
		api.Err = fmt.Errorf("保存文件失败: %v", err)
		return api
	}
	
	return api
}

// WriteRow 向指定行写入数据
// 参数：
//   line - 行号，从0开始（0表示第1行）
//   data - 要写入的数据切片，支持任意类型
// 返回值：
//   *ApiWrite - 支持链式调用的ApiWrite指针
// 说明：
//   - 如果line为负数，会设置api.Err错误并返回
//   - 如果文件打开失败，会输出错误信息并返回
//   - 数据写入后会自动保存文件
//   - 支持链式操作，可以连续调用多个方法
// 示例：
//   api.WriteRow(0, []interface{}{"姓名", "年龄", "城市"})
//   api.WriteRow(1, []interface{}{"张三", 25, "北京"})
func (api *ApiWrite) WriteRow(line int, data []interface{}) *ApiWrite {
	// 参数验证：检查行号是否为负数
	if line < 0 {
		api.Err = fmt.Errorf("行号不能为负数")
		return api
	}
	
	// 打开已有的Excel文件
	xlsx, err := excelize.OpenFile(api.FileName)
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return api
	}
	
	// 确保文件正确关闭，释放资源
	defer func() {
		if err = xlsx.Close(); err != nil {
			fmt.Printf("关闭文件失败: %v\n", err)
		}
	}()
	
	// 将行号转换为Excel单元格坐标（从A1开始，line+1是因为Excel行号从1开始）
	cell, err := excelize.CoordinatesToCellName(1, line+1)
	if err != nil {
		fmt.Printf("坐标转换失败: %v\n", err)
		return api
	}
	
	// 设置整行数据
	err = xlsx.SetSheetRow(api.SheetName, cell, &data)
	if err != nil {
		api.Err = fmt.Errorf("写入数据失败: %v", err)
		return api
	}
	
	// 保存修改后的文件
	err = xlsx.SaveAs(api.FileName)
	if err != nil {
		api.Err = fmt.Errorf("保存文件失败: %v", err)
		return api
	}
	
	return api
}
